#define quickread
#ifdef quickread
#include <cstdio> 
template <typename T>
inline void read(T& x)
{
    int c=getchar(), f=1; x=0;
    while(c<'0'||'9'<c) {if(c=='-') f=-1; c=getchar();}
    while('0'<=c&&c<='9') 
        x=(x<<3)+(x<<1)+c-'0', c=getchar();
    x*=f;
}
template <typename T>
inline void quickwrite(T x)
{
    if(x>=10) quickwrite(x/10);
    putchar(x%10+'0');
}
#else 
#include <iostream>
#endif
#include <cstring>
#include <algorithm>
using namespace std;
#define DEBUG
using ll=long long;
const int N=1e7+10;
int tot=1, last=1; //tot表示当前用到的编号，last表示上一个点的编号，1号是源点

struct Node{
    int len, fa; //len表示当前状态中所有字串的最大长度，fa表示Link边指向的状态
    int ch[4];
} node[N<<1];//存储后缀自动机的每个状态
int n, m;
char str[N]; //原字符串
ll f[N]; //f[i]表示后缀自动机中状态i的endpos大小
int h[N], e[N], ne[N], idx;
ll res;

inline int get(char c)
{
    switch(c)
    {
        case 'E':return 0;
        case 'S':return 1;
        case 'W':return 2;
        case 'N':return 3;
        default:return -1;
    }
}

void AddEdge(int a, int b)
{
    e[idx]=b, ne[idx]=h[a], h[a]=idx++;
}

void extend(int c)
{
    //p表示上一个插入的状态，np表示当前插入的新状态
    int p=last, np=last=++tot;
    //依次加入每个点，则每次插入得到的新状态都是一个前缀,递推时无法记录前缀，这里提前算上每个前缀在endpos中的贡献
    node[np].len=node[p].len+1; //新状态的长度= 旧状态的长度+1
    //p的末尾加上c，则p沿着Link边往下走到的所有状态都应该加上c
    for(; p&&!node[p].ch[c]; p=node[p].fa) node[p].ch[c]=np;
    if(!p) node[np].fa=1;
    else
    {
        //否则说明从当前p开始沿着Link边走到的所有状态后面都有c，此时当前的p加上c后的状态就是一个新的等价类
        //新状态no的Link应该指向当前的p加上c后的状态q
        int q=node[p].ch[c];
        //如果q的长度正好是p的长度+1，则np的Link边直接指向q
        if(node[q].len==node[p].len+1) node[np].fa=q;
        else
        {
            //否则需要拷贝一个长度是p的长度+1的新状态，再令q和np的Link边指向拷贝后的状态nq
            int nq=++tot;
            node[nq]=node[q], node[nq].len=node[p].len+1; //拷贝并修改长度
            node[q].fa=node[np].fa=nq; //令q和np的Link边指向nq
            for(;p&&node[p].ch[c]==q; p=node[p].fa) node[p].ch[c]=nq; //再将指向q的所有普通边改成指向nq
        }
    }
}

void init()
{
    idx=0;
    memset(h, -1, sizeof h); 
    read(n); read(m);
    scanf("%s", str);
    for(int i=0; str[i]; i++) extend(get(str[i]));
}

void solve()
{
    init();
    while(m--)
    {
        scanf("%s", str);
        int p=1, res=0;
        for(int i=0; str[i]; i++)
        {
            int c=get(str[i]);
            if(node[p].ch[c]) p=node[p].ch[c], res++;
            else break;
        }
        quickwrite(res); puts("");
    }
}

// #undef DEBUG
signed main()
{
    #ifdef DEBUG
        freopen("./in.txt", "r", stdin);
        freopen("./out.txt", "w", stdout);
    #endif
    #ifndef quickread
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    #endif

    int T=1; //scanf("%d", &T);
    while(T--) 
    {
        solve();
    }
    return 0;
}